package niveles;

import principal.Constantes;
import basicas.Posicion;
import juego.ObjetoDelJuego;
import juego.Tanque;
import juego.enums.tipoMovimiento;

public class Tablero {
	private int[][] matriz;
	
	public Tablero() {
		matriz = new int[Constantes.ANCHO_CASILLEROS_TABLERO][Constantes.ALTO_CASILLEROS_TABLERO];
	}

	public boolean sePuedeMover(ObjetoDelJuego objeto, tipoMovimiento direccion) {		

		if (verificaLimites(objeto.getPosicion(), direccion)) {						
			return verificaObstaculos(objeto, direccion);
		} else {
			return false;
		}
	}

	private boolean verificaObstaculos(ObjetoDelJuego objeto, tipoMovimiento direccion) {	
		boolean b = true;		
		int xr, yr;
		Posicion posicion = objeto.getPosicion();
		xr = Math.round((float)(posicion.getX()));
		yr = Math.round((float)(posicion.getY()));
		switch(direccion) {
			case arriba: yr = yr - 1; break;
			case abajo: yr = yr + 1; break;
			case izquierda: xr = xr - 1; break;
			case derecha: xr = xr + 1; break;
		}
		if (matriz[xr][yr] == Constantes.VALOR_CASILLERO_LIBRE) b = true; else b = false;
		return b;
	}

	private boolean verificaLimites(Posicion posicion, tipoMovimiento direccion) {

		Posicion pos = posicion.Copiar();
		int xr, yr; //, xi, yi;
		xr = Math.round((float)(pos.getX()));
		yr = Math.round((float)(pos.getY()));
				
		switch(direccion) {
			case arriba: yr = yr - 1; break;
			case abajo: yr = yr + 1; break;
			case izquierda: xr = xr - 1; break;
			case derecha: xr = xr + 1; break;
		}
		return dentroLimites(xr, yr);
	}

	public void ocuparPosicion(ObjetoDelJuego objeto) {
		
		int x, y;
		Posicion posicion = objeto.getPosicion();
		
		x = Math.round((float)(posicion.getX()));
		y = Math.round((float)(posicion.getY()));

		matriz[x][y] = /*matriz[x][y] +*/ objeto.getId();
		
		x = (int) Math.rint(posicion.getX());
		y = (int) Math.rint(posicion.getY());
		if (dentroLimites(x, y)) matriz[x][y] = objeto.getId();
		//System.out.println(objeto.getId());
	}

	public void limpiar() {
		for (int i = 0; i < Constantes.ANCHO_CASILLEROS_TABLERO; i++) {
			for (int j = 0; j < Constantes.ALTO_CASILLEROS_TABLERO; j ++) {
				matriz[i][j] = Constantes.VALOR_CASILLERO_LIBRE;
			}
		}
	}

	public int casillero(int x, int y) {		
		return matriz[x][y];
	}

	public boolean dentroLimites(int xb, int yb) {
		if (xb >= 0) if (yb >= 0) if (xb < Constantes.ANCHO_CASILLEROS_TABLERO) 
			if (yb < Constantes.ALTO_CASILLEROS_TABLERO) 
				return true;
		return false;
	}
	
	public boolean dentroLimites(Posicion posicion) {
		int x, y;
		x = Math.round((float)(posicion.getX()));
		y = Math.round((float)(posicion.getY()));		
		return dentroLimites(x, y);		
	}	
	
	public void reservarPosicion(Tanque objeto) {
		int x, y;
		Posicion posicion = objeto.getPosicion();
		
		x = Math.round((float)(posicion.getX()));
		y = Math.round((float)(posicion.getY()));		
		
		switch(objeto.getDireccion()) {
			case arriba: y = Math.round((float)(posicion.getY())) - 1; break;
			case abajo: y = Math.round((float)(posicion.getY())) + 1; break;
			case izquierda: x = Math.round((float)(posicion.getX())) - 1; break;
			case derecha: x = Math.round((float)(posicion.getX())) + 1; break;						
		}
		
		if (dentroLimites(x, y)) matriz[x][y] = objeto.getId();
	}

	public boolean estaOcupado(Posicion posicion) {	
		if (matriz[(int)posicion.getX()][(int)posicion.getY()] != Constantes.VALOR_CASILLERO_LIBRE) {
			return true;
		} else {
			return false;
		}
	}
}

